fix(readonly): avoid implicit hydration when modifying permissions
authorMatthieu Gallien <matthieu.gallien@nextcloud.com>
Wed, 28 May 2025 15:14:46 +0000 (17:14 +0200)
committerMatthieu Gallien <matthieu.gallien@nextcloud.com>
Mon, 2 Jun 2025 11:05:46 +0000 (13:05 +0200)
Signed-off-by: Matthieu Gallien <matthieu.gallien@nextcloud.com>
src/libsync/filesystem.cpp

index c2a7b8ed508c38d1efb3f67b6ccfe23c33bfeae8..515d02b1581c85516c4698a8b2fa1f6ddfa847d4 100644 (file)
@@ -474,7 +474,17 @@ bool FileSystem::setFolderPermissions(const QString &path,
     const auto childFiles = currentFolder.entryList(QDir::Filter::Files);
     for (const auto &oneEntry : childFiles) {
         const auto childFile = QDir::toNativeSeparators(path + QDir::separator() + oneEntry);
-        if (!SetFileSecurityW(childFile.toStdWString().c_str(), info, &newSecurityDescriptor)) {
+
+        const auto &childFileStdWString = childFile.toStdWString();
+        const auto attributes = GetFileAttributes(childFileStdWString.c_str());
+
+        // testing if that could be a pure virtual placeholder file (i.e. CfApi file without data)
+        // we do not want to trigger implicit hydration ourself
+        if ((attributes & FILE_ATTRIBUTE_SPARSE_FILE) != 0) {
+            continue;
+        }
+
+        if (!SetFileSecurityW(childFileStdWString.c_str(), info, &newSecurityDescriptor)) {
             qCWarning(lcFileSystem) << "error when calling SetFileSecurityW" << childFile << GetLastError();
             return false;
         }